可移植操作系统接口（英语：Portable Operating System Interface，缩写为POSIX）是IEEE为要在各种UNIX操作系统上运行软件，
而定义API的一系列互相关联的标准的总称，其正式称呼为IEEE Std 1003，而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。
POSIX这个名称是由理查德·斯托曼（RMS）应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface
（可移植操作系统接口）的缩写，而X则表明其对Unix API的传承。

1.2Posix标准C头文件(24项) 
<assert.h> ---------------------- 验证程序断言
<complex.h> ---------------------- 支持复数算术运算
<ctype.h> ---------------------- 字符类型
<errno.h> ---------------------- 出错码
<fenv.h> ---------------------- 浮点环境
<float.h> ---------------------- 浮点常量
<inttypes.h> ---------------------- 整型格式转换
<iso646.h> ---------------------- 替代关系操作符宏
<limits.h> ---------------------- 实现常量
<locale.h> ---------------------- 局部类别
<math.h> ---------------------- 数学常量
<setjmp.h> ---------------------- 非局部goto
<signal.h> ---------------------- 信号
<stdarg.h> ---------------------- 可变参数表
<stdbool.h> ---------------------- 布尔类型和值
<stddef.h> ---------------------- 标准定义
<stdint.h> ---------------------- 整型
<stdio.h> ---------------------- 标准I/O库
<stdlib.h> ---------------------- 实用程序库函数
<string.h> ---------------------- 字符串操作
<tgmath.h> ---------------------- 通用类型数学宏
<time.h> ---------------------- 时间和日期
<wchar.h> ---------------------- 扩展的多字节和宽字符支持
<wctype.h> ---------------------- 宽字符分类和映射支持

POSIX标准定义的基本头文件(26项) 
<dirent.h> ---------------------- 目录项
<fcntl.h> ---------------------- 文件控制
<fnmatch.h> ---------------------- 文件名匹配类型
<glob.h> ---------------------- 路径名模式匹配类型
<grp.h> ---------------------- 组文件
<netdb.h> ---------------------- 网络数据库操作
<pwd.h> ---------------------- 口令文件
<regex.h> ---------------------- 正则表达式
<tar.h> ---------------------- tar归档值
<termios.h> ---------------------- 终端I/O
<unistd.h> ---------------------- 符号常量
<utime.h> ---------------------- 文件时间
<wordexp.h> ---------------------- 字扩展类型
<arpa/inet.h> ---------------------- Internet定义
<net/if.h> ---------------------- 套接字本地接口
<netinet/in.h> ---------------------- Internet地址族
<netinet/tcp.h> ---------------------- 传输控制协议定义
<sys/mman.h> ---------------------- 内存管理声明
<sys/select.h> ---------------------- select函数
<sys/socket.h> ---------------------- 套接字接口
<sys/stat.h> ---------------------- 文件状态
<sys/times.h> ---------------------- 进程时间
<sys/types.h> ---------------------- 基本系统数据类型
<sys/un.h> ---------------------- UNIX域套接字定义
<sys/utsname.h> ---------------------- 系统名
<sys/wait.h> ---------------------- 进程控制

POSIX标准定义的XSI扩展头文件(26项) 
<cpio.h> ---------------------- cpio归档值
<dlfcn.h> ---------------------- 动态链接
<fmtmsg.h> ---------------------- 消息显示结构
<ftw.h> ---------------------- 文件树漫游
<iconv.h> ---------------------- 代码集转换实用程序
<langinfo.h> ---------------------- 语言信息常量
<libgen.h> ---------------------- 模式匹配函数定义
<monetary.h> ---------------------- 货币类型
<ndbm.h> ---------------------- 数据库操作
<nl_types.h> ---------------------- 消息类别
<poll.h> ---------------------- 轮询函数
<search.h> ---------------------- 搜索表
<strings.h> ---------------------- 字符串操作
<syslog.h> ---------------------- 系统出错日志记录
<ucontext.h> ---------------------- 用户上下文
<ulimit.h> ---------------------- 用户限制
<utmpx.h> ---------------------- 用户帐户数据库
<sys/ipc.h> ---------------------- IPC
<sys/msg.h> ---------------------- 消息队列
<sys/resource.h> ------------------- 资源操作
<sys/sem.h> ---------------------- 信号量
<sys/shm.h> ---------------------- 共享存储
<sys/statvfs.h> ---------------------- 文件系统信息
<sys/time.h> ---------------------- 时间类型
<sys/timeb.h> ---------------------- 附加的日期和时间定义
<sys/uio.h> ---------------------- 矢量I/O操作

POSIX标准定义的可选头文件(8项) 
<aio.h> ---------------------- 异步I/O
<mqueue.h> ---------------------- 消息队列
<pthread.h> ---------------------- 线程
<sched.h> ---------------------- 执行调度
<semaphore.h> ---------------------- 信号量
<spawn.h> ---------------------- 实时spawn接口
<stropts.h> ---------------------- XSI STREAMS接口
<trace.h> ---------------------- 时间跟踪
---------------------------------------------------------------------------------------------------
————————————————
版权声明：本文为CSDN博主「生活需要深度」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/u012294613/article/details/124634053

Base Definitions、
System Interfaces、
Shell and Utilities、
Rationale

Posix标准的出现就是为了解决这个问题。linux和windows都要实现基本的posix标准，linux把fork函数封装成posix_fork（随便说的），windows把creatprocess函数也封装成posix_fork，都声明在unistd.h里。这样，程序员编写普通应用时候，只用包含unistd.h，调用posix_fork函数，程序就在源代码级别可移植了。
POSIX标准的文件接口有：close、creat、open、read、sync、write、dup、dup2、flock、fcntl、fsync、lseek、mkstemp等。
二、文件系统类型
    文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构；即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统，简称文件系统。
    从系统角度来看，文件系统是对文件存储设备的空间进行组织和分配，负责文件存储并对存入的文件进行保护和检索的系统。具体地说，它负责为用户建立文件，存入、读出、修改、转储文件，控制文件的存取，安全控制，日志，压缩，加密等。
常见的文件系统类型有：
    ext2（Extended file system），ext3，ext4
    xfs，brtfs，zfs，UFS、UFS2、HFS等
    JFS、JFS2（IBM AIX系统使用的文件系统）
    FAT16、FAT32、NTFS
    上面除了ext2不支持journal日志功能，其他都持续日志功能，同时支持日志的方式也有所不同，这些方式分别有自己特性，不过总的区别是文件安全和性能之间的取舍。
    文件系统简单来说，好比一个停车场，但是比停车场更加复杂，更加有序，读写的文件，就是通过文件系统来管理的。分区必须经过格式化后才可以使用，格式化的过程就是在分区内建立文件系统的过程。
    不同文件系统采用不同的方法来管理磁盘空间，根据存储设备的硬件特性、系统需求等有不同的应用场合。
ext2具有极快的速度和极小的CPU占用率，可用于硬盘和移动存储设备
ext3增加日志功能，可回溯追踪
ext4日志式文件系统，支持1EB（1024*1024TB），最大单文件16TB，支持连续写入可减少文件碎片。为rhel6默认文件系统。
xfs可以管理500T的硬盘。为rhel7默认文件系统。
brtfs文件系统针对固态盘做优化。
NTFS：支持最大分区2TB，最大文件2TB，安全性和稳定性非常好，不易出现文件碎片。
JFS2(又称 enhanced journaled file system)是最早期的日志文件系统。很早就被应用于 IBM AIX操作系统。
其他文件系统：
RAMFS：内存文件系统
ISO 9660：光盘
NFS：网络文件系统
SMBAFS/CIFS：支持Samba协议的网络文件系统
Linux swap：交换分区，用以提供虚拟内存。
主要由三类：
基于磁盘
基于网络
虚拟
为了对各类文件系统进行统一管理，Linux引入了虚拟文件系统VFS(Virtual File System)，为各类文件系统提供一个统一的操作界面和应用编程接口。可以肯定的是 文件系统（FS）之下直接面对的就是硬件存储设备（的物理块层，下面还有驱动层）。
Linux系统文件架构：
User层：GLIBC ---> 内核Kernel层：SCI --> VFS --> FS --> Block layer --> Device drivers

（2） 文件系统基本操作
创建文件系统：mkfs，mke2fs
mkfs：mkfs命令用于在设备上（通常为硬盘）创建Linux文件系统。mkfs本身并不执行建立文件系统的工作，而是去调用相关的程序来执行。
mke2fs ：mke2fs命令被用于创建磁盘分区上的“etc2/etc3”文件系统。
文件系统标签：blkid，e2label，findfs，
blkid：blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备（包括交换分区）所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。
e2label ：e2label命令用来设置第二扩展文件系统的卷标。
findfs ：findfs命令依据卷标（Label）和UUID查找文件系统所对应的设备文件。findfs命令会搜索整个磁盘，看是否有匹配的标签或者UUID没有，如果有则打印到标注输出上。findfs命令也是e2fsprogs项目的一部分。
重定义：tune2fs
tune2fs ：tune2fs命令允许系统管理员调整“ext2/ext3”文件系统中的可该参数。Windows下面如果出现意外断电死机情况，下次开机一般都会出现系统自检。Linux系统下面也有文件系统自检，而且是可以通过tune2fs命令，自行定义自检周期及方式。
查询超级块：dumpe2fs
dumpe2fs ：dumpe2fs命令用于打印“ext2/ext3”文件系统的超级块和快组信息。

合规是自愿的
我们所有人都至少见过这样的信息：“如需帮助，请输入：XXXX -help”。这在 Linux 中很常见，但是这不符合 POSIX 标准。POSIX 从来没有要求双破折号，他们希望用一个破折号。双破折号来自 GNU，然而，它并没有损害 Linux，而且还为其增加了一点特性。同时，Linux 大部分都是兼容 POSIX 的，特别是在涉及到系统调用接口时。这就是为什么我们能够在 Linux、Sys V UNIX 和 BSD UNIX 上运行 X、GNOME 和 KDE 应用程序。各种命令，如 ls、cat、grep、find、awk 等，在不同的变体中操作相同。

作为一项规则，合规是一个自愿的步骤。当代码符合要求时，移到另一个系统上就比较容易，很少有必要或根本不需要重写代码。当代码可以在不同的系统上工作时，它的使用范围就会扩大。使用其他系统的人可以从使用该程序中受益。对于初出茅庐的程序员来说，学习如何编写符合 POSIX 标准的程序，就能对他们的职业生涯有所帮助。对于那些对 Linux 领域的合规性感兴趣的读者，可以在以下网站找到很多好的信息： Linux 基本标准（LSB）

由于用户在UNIX下经常会遇到SUID、SGID的概念，而且SUID和SGID涉及到系统安全，所以用户也比较关心这个问题。关于SUID、 SGID的问题也经常有人提问，但回答的人一般答得不够详细，加上曾经回答过两个网友的问题，还查了一些资料，决定整理成本文，以供大家参考。限于本人的水平问题，文章中如果有不当之处，请广大网友指正。

一、UNIX下关于文件权限的表示方法和解析

SUID 是 Set User ID, SGID 是 Set Group ID的意思。

UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的：-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位：

9 8 7 6 5 4 3 2 1 0 
- r w x r - x r - x

第9位表示文件类型,可以为p、d、l、s、c、b和-：

p表示命名管道文件 
d表示目录文件 
l表示符号连接文件 
-表示普通文件 
s表示socket文件 
c表示字符设备文件 
b表示块设备文件

第8-6位、5-3位、2-0位分别表示文件所有者的权限，同组用户的权限，其他用户的权限，其形式为rwx：
r表示可读，可以读出文件的内容
w表示可写，可以修改文件的内容
x表示可执行，可运行这个程序
没有权限的位置用-表示
例子：
ls -l myfile显示为：
-rwxr-x--- 1 foo staff 7734 Apr 05 17:07 myfile
表示文件myfile是普通文件，文件的所有者是foo用户，而foo用户属于staff组，文件只有1个硬连接，长度是7734个字节，最后修改时间4月5日17:07。
所有者foo对文件有读写执行权限，staff组的成员对文件有读和执行权限，其他的用户对这个文件没有权限。
如果一个文件被设置了SUID或SGID位，会分别表现在所有者或同组用户的权限的可执行位上。例如：
1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置
2、-rwSr--r-- 表示SUID被设置，但所有者权限中可执行位没有被设置
3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置
4、-rw-r-Sr-- 表示SGID被设置，但同组用户权限中可执行位没有被社
其实在UNIX的实现中，文件权限用12个二进制位表示，如果该位置上的值是
1，表示有相应的权限：
11 10 9 8 7 6 5 4 3 2 1 0 
S G T r w x r w x r w x
第11位为SUID位，第10位为SGID位，第9位为sticky位，第8-0位对应于上面的三组rwx位。
11 10 9 8 7 6 5 4 3 2 1 0
上面的-rwsr-xr-x的值为： 1 0 0 1 1 1 1 0 1 1 0 1
-rw-r-Sr--的值为： 0 1 0 1 1 0 1 0 0 1 0 0
文件加SUID和SUID的命令如下：
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置
chmod g+s filename 设置SGID位
chmod g-s filename 去掉SGID设置
另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。
二、SUID和SGID的详细解析
由于SUID和SGID是在执行程序（程序的可执行位被设置）时起作用，而可执行位只对普通文件和目录文件有意义，所以设置其他种类文件的SUID和SGID位是没有多大意义的。
首先讲普通文件的SUID和SGID的作用。例子：
如果普通文件myfile是属于foo用户的，是可执行的，现在没设SUID位，ls命令显示如下：
-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢？是这个进程的运行用户的（有效）ID，包括 user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。
除了一般的user id 和group id外，还有两个称之为effective 的id，就是有效id，上面的四个id表示为：uid，gid，euid，egid。内核主要是根据euid和egid来确定进程对资源的访问权限。
一个进程如果没有SUID或SGID位，则euid=uid egid=gid，分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202，foo用户的uid和gid为 200，201，kevin运行myfile程序形成的进程的euid=uid=204，egid=gid=202，内核根据这些值来判断进程对资源访问的限制，其实就是kevin用户对资源访问的权限，和foo没关系。 

如果一个程序设置了SUID，则euid和egid变成被运行的程序的所有者的uid和gid，例如kevin用户运行myfile，euid=200，egid=201，uid=204，gid=202，则这个进程具有它的属主foo的资源访问权限。
SUID的作用就是这样：让本来没有相应权限的用户运行这个程序时，可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。
SUID的优先级比SGID高，当一个可执行程序设置了SUID，则SGID会自动变成相应的egid。
下面讨论一个例子：
UNIX系统有一个/dev/kmem的设备文件，是一个字符设备文件，里面存储了核心程序要访问的数据，包括用户的口令。所以这个文件不能给一般的用户读写，权限设为：cr--r----- 1 root system 2, 1 May 25 1998 kmem
但ps等程序要读这个文件，而ps的权限设置如下：
-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps
这是一个设置了SGID的程序，而ps的用户是bin，不是root，所以不能设置SUID来访问kmem，但大家注意了，bin和root都属于 system组，而且ps设置了SGID，一般用户执行ps，就会获得system组用户的权限，而文件kmem的同组用户的权限是可读，所以一般用户执行ps就没问题了。但有些人说，为什么不把ps程序设置为root用户的程序，然后设置SUID位，不也行吗？这的确可以解决问题，但实际中为什么不这样做呢？因为SGID的风险比SUID小得多，所以出于系统安全的考虑，应该尽量用SGID代替SUID的程序，如果可能的话。下面来说明一下SGID对目录的影响。SUID对目录没有影响。如果一个目录设置了SGID位，那么如果任何一个用户对这个目录有写权限的话，他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组，而文件所有者不变，还是属于建立这个文件的用户。
三、关于SUID和SGID的编程
和SUID和SGID编程比较密切相关的有以下的头文件和函数：
 #include
#include
 uid_t getuid(void);
 uid_t geteuid(void);
 gid_t getgid (void);
 gid_t getegid (void);
 int setuid (uid_t UID);
 int setruid (uid_t RUID);
 int seteuid (uid_t EUID);
 int setreuid (uid_t RUID,uid_t EUID);
int setgid (gid_t GID);
 int setrgid (gid_t RGID);
 int setegid (git_t EGID);
int setregid (gid_t RGID, gid_t EGID);
 具体这些函数的说明在这里就不详细列出来了,要用到的可以用man查。
 SUID/SGID :
假如你有文件a.txt
#ls -l a.txt
-rwxrwxrwx
#chmod 4777 a.txt
rwsrwxrwx ======>注意s位置
#chmod 2777 a.txt
-rwxrwsrwx ======>注意s位置
#chmod 7777 a.txt
-rwsrwxswt ======>出现了t,t的作用在内存中尽量保存a.txt,节省系统再加载的时间.
 
现在再看前面设置 SUID/SGID作用:
#cd /sbin
#./lsusb
...
#su aaa(普通用户)
$./lsusb

..
是不是现在显示出错？
$su
#chmod 4755 lsusb
#su aaa
$./lsusb
 ... 现在明白了吗？本来是只有root用户才能执行的命令，加了SUID后,普通用户就可以像root一样的用，权限提升了。上面是对于文件来说的，对于目录也差不多！
目录的S属性使得在该目录下创建的任何文件及子目录属于该目录所拥有的组，目录的T属性使得该目录的所有者及root才能删除该目录。还有对于s与S，设置SUID/SGID需要有运行权限，否则用ls -l后就会看到S,证明你所设置的SUID/SGID没有起作用。

Why we need suid,how do we use suid?
 　　r -- 读访问
　　 w -- 写访问
 　　x -- 执行许可
 　　s -- SUID/SGID
 　　t -- sticky位
 那么 suid/sgid是做什么的？ 为什么会有suid位呢？
 要想明白这个，先让我们看个问题：如果让每个用户更改自己的密码？
 用户修改密码，是通过运行命令passwd来实现的。最终必须要修改/etc/passwd文件，而passwd的文件的属性是：
 #ls -l /etc/passwd
 -rw-r--r-- 1 root root 2520 Jul 12 18:25 passwd
 我们可以看到passwd文件只有对于root用户是可写的，而对于所有的他用户来说都是没有写权限的。 那么一个普通的用户如何能够通过运行passwd命令修改这个passwd文件呢？
 为了解决这个问题，SUID/SGID便应运而生。而且AT&T对它申请了专利。 呵呵。
 SUID和SGID是如何解决这个问题呢？

首先，我们要知道一点：进程在运行的时候，有一些属性，其中包括 实际用户ID,实际组ID,有效用户ID,有效组ID等。 实际用户ID和实际组ID标识我们是谁，谁在运行这个程序,一般这2个字段在登陆时决定，在一个登陆会话期间， 这些值基本上不改变。
 而有效用户ID和有效组ID则决定了进程在运行时的权限。内核在决定进程是否有文件存取权限时，是采用了进程的有效用户ID来进行判断的。
知道了这点，我们来看看SUID的解决途径：
 当一个程序设置了为SUID位时，内核就知道了运行这个程序的时候，应该认为是文件的所有者在运行这个程序。即该程序运行的时候，有效用户ID是该程序的所有者。举个例子：
[root@sgrid5 bin]# ls -l passwd
 -r-s--s--x 1 root root 16336 Feb 14 2003 passwd
 虽然你以test登陆系统，但是当你输入passwd命令来更改密码的时候，由于passwd设置了SUID位，因此虽然进程的实际用户ID是test对应的ID，但是进程的有效用户ID则是passwd文件的所有者root的ID,因此可以修改/etc/passwd文件。
 
让我们看另外一个例子。

ping命令应用广泛，可以测试网络是否连接正常。ping在运行中是采用了ICMP协议，需要发送ICMP报文。但是只有root用户才能建立ICMP报文，如何解决这个问题呢？同样，也是通过SUID位来解决。
 [root@sgrid5 bin]# ls -l /bin/ping
 -rwsr-sr-x 1 root root 28628 Jan 25 2003 /bin/ping
 我们可以测试一下，如果去掉ping的SUID位，再用普通用户去运行命令，看会怎么样。
 [root@sgrid5 bin]#chmod u-s /bin/ping

[root@sgrid5 bin]# ls -l ping -rwxr-xr-x 1 root root 28628 Jan 25 2003 ping
 [root@sgrid5 bin]#su test
 [test@sgrid5 bin]$ ping byhh.net
 ping: icmp open socket: Operation not permitted
 SUID虽然很好了解决了一些问题，但是同时也会带来一些安全隐患。
 因为设置了 SUID 位的程序如果被攻击(通过缓冲区溢出等方面),那么hacker就可以拿到root权限。
 因此在安全方面特别要注意那些设置了SUID的程序。
 通过以下的命令可以找到系统上所有的设置了suid的文件：
 [root@sgrid5 /]# find / -perm -04000 -type f -ls
 对于这里为什么是4000，大家可以看一下前面的st_mode的各bit的意义就明白了。
 在这些设置了suid的程序里，如果用不上的，就最好取消该程序的suid位


setregid（设置真实及有效的组识别码）
相关函数 setgid，setegid，setfsgid
表头文件 #include<unistd.h>
定义函数 int setregid(gid_t rgid,gid_t egid);
函数说明
setregid()用来将参数rgid设为目前进程的真实组识别码，将参数
egid设置为目前进程的有效组识别码。如果参数rgid或egid值为-
1，则对应的识别码不会改变。
返回值 执行成功则返回0，失败则返回-1，错误代码存于errno。
范例:
无

setreuid（设置真实及有效的用户识别码）
相关函数 setuid，seteuid，setfsuid
表头文件 #include<unistd.h>
定义函数 int setreuid(uid_t ruid,uid_t euid);
函数说明 setreuid()用来将参数ruid 设为目前进程的真实用户识别码，将参
数euid 设置为目前进程的有效用户识别码。如果参数ruid 或euid
值为-1，则对应的识别码不会改变。
返回值 执行成功则返回0，失败则返回-1，错误代码存于errno。
附加说明 请参考setuid（）。
范例:
无

setuid（设置真实的用户识别码）
相关函数 getuid，setreuid，seteuid，setfsuid
表头文件 #include<unistd.h>
定义函数 int setuid(uid_t uid)
函数说明 setuid()用来重新设置执行目前进程的用户识别码。不过，要让此函数有作用，其有效的用户识别码必须为0(root)。在Linux下，当root使用setuid()来变换成其他用户识别码时，root权限会被抛弃，完全转换成该用户身份，也就是说，该进程往后将不再具有可setuid()的权利，如果只是向暂时抛弃root
权限，稍后想重新取回权限，则必须使用seteuid()。
返回值 执行成功则返回0，失败则返回-1，错误代码存于errno。
附加说明 一般在编写具setuid root的程序时，为减少此类程序带来的系统安全风险，在使用完root权限后建议马上执行setuid(getuid());来抛弃root权限。此外，进程uid和euid不一致时Linux系统将不会产生core
dump。
范例:
无
setfsuid（设置文件系统的用户识别码）
相关函数 setuid，setreuid，seteuid，setfsgid
表头文件 #include<unistd.h>
定义函数 int setfsuid(uid_t fsuid);
函数说明 setfsuid()用来重新设置目前进程的文件系统的用户识别码。一般情况下，文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的。如果是超级用户调用此函数，参数fsuid可以为任何值，否则参数fsuid必须为real/effective/saved的用户识别码之一。
返回值 执行成功则返回0，失败则返回-1，错误代码存于errno
附加说明 此函数为Linux特有
错误代码 EPERM 权限不够，无法完成设置。
范例:
setfsgid（设置文件系统的组识别码）
相关函数 setuid，setreuid，seteuid，setfsuid
表头文件 #include<unistd.h>
定义函数 int setfsgid(uid_t fsgid);
函数说明 setfsgid()用来重新设置目前进程的文件系统的组识别码。一般情况下，文件系统的组识别码(fsgid)与有效的组识别码(egid)是相同的。如果是超级用户调用此函数，参数fsgid
可以为任何值，否则参数fsgid必须为real/effective/saved的组识别码之一。
返回值 执行成功则返回0，失败则返回-1，错误代码存于errno。
附加说明 此函数为Linux特有。
错误代码 EPERM 权限不够，无法完成设置。
范例:
setpgid（设置进程组识别码）
相关函数 getpgid，setpgrp，getpgrp
表头文件 #include<unistd.h>
定义函数 int setpgid(pid_t pid,pid_t pgid);
函数说明 setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码。如果参数pid 为0，则会用来设置目前进程的组识别码，如果参数pgid为0，则会以目前进程的进程识别码来取代。
返回值 执行成功则返回组识别码，如果有错误则返回-1，错误原因存于errno中。
错误代码 EINVAL 参数pgid小于0。
EPERM 进程权限不足，无法完成调用。
ESRCH 找不到符合参数pid指定的进程。
范例:
https://www.wenjiangs.com/doc/setpgid

https://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html
https://developers.redhat.com/blog/2016/02/25/new-asm-flags-feature-for-x86-in-gcc-6
